package com.hotel.utils.aes_res;


import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;


/**
 * 前后端数据传输加密工具类
 * @author monkey
 *
 */
public class AesUtil {

    //参数分别代表 算法名称/加密模式/数据填充方式
    private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";

    /**
     * 加密
     * @param content 加密的字符串
     * @param encryptKey key值
     * @return
     * @throws Exception
     */
    public static String encrypt(String content, String encryptKey) throws Exception {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128);
        Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
        byte[] b = cipher.doFinal(content.getBytes("utf-8"));
        // 采用base64算法进行转码,避免出现中文乱码
        return Base64.encodeBase64String(b);

    }

    /**
     * 解密
     * @param encryptStr 解密的字符串
     * @param decryptKey 解密的key值
     * @return
     * @throws Exception
     */
    public static String decrypt(String encryptStr, String decryptKey) throws Exception {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128);
        Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
        // 采用base64算法进行转码,避免出现中文乱码
        byte[] encryptBytes = Base64.decodeBase64(encryptStr);
        byte[] decryptBytes = cipher.doFinal(encryptBytes);
        return new String(decryptBytes);
    }
}


//import org.apache.commons.codec.binary.Base64;
//import org.bouncycastle.jce.provider.BouncyCastleProvider;
//
//import javax.crypto.Cipher;
//import javax.crypto.spec.SecretKeySpec;
//import java.nio.charset.StandardCharsets;
//import java.security.SecureRandom;
//
///**
// * Aes工具类
// */
//public class AesUtil {
//    /**
//     * 加密的算法AES
//     */
//    private static final String KEY_ALGORITHM = "AES";
//
//    /**
//     * ket的长度 128、192、256
//     */
//    private static final int KEY_LENGTH = 16 * 8;
//
//    /**
//     * 算法：算法名称/加密模式/数据填充方式
//     */
//    private static final String ALGORITHMS = "AES/ECB/PKCSSPadding";
//
//    /**
//     * 后端AES的key，由静态代码块赋值
//     */
//    public static String key;
//
//    /**
//     * 使用static只new一次，避免内存泄露(BouncyCastleProvider内部提供的方法都是static，每次加载都会创建额外内存开销)
//     * BouncyCastleProvider算是加密算法的提供商，内部提供了各种加密算法
//     */
//    public static final BouncyCastleProvider PROVIDER = new BouncyCastleProvider();
//
//    /**
//     * 初始化key
//     */
//    static {
//        key = getKey();
//    }
//
//    /**
//     * 获取key
//     * @return
//     */
//    public static String getKey() {
//        int lenght = KEY_LENGTH / 8; // 定义长度
//        StringBuffer uid = new StringBuffer(lenght); // 使用线程安全的StringBuffer构造一个字符串对象
//        // 产生16位安全的随机数
//        SecureRandom rd = new SecureRandom();
//        for (int i = 0; i < lenght; i++) {
//            switch (rd.nextInt(3)) {
//                case 0:
//                    // 0-9的随机数
//                    uid.append(rd.nextInt()); // 拼接随机数
//                    break;
//                case 1:
//                    // ASCII在65-90之间，获取随即大写字母
//                    uid.append((char) (rd.nextInt(26) + 65));
//                    break;
//                case 2:
//                    // 获取随机小写字母
//                    uid.append((char) (rd.nextInt(26) + 97));
//                    break;
//                default:
//                    break;
//            }
//        }
//        return uid.toString(); // 转成string
//    }
//
//    /**
//     * 加密
//     * @param content    加密的字符串
//     * @param encryptKey key的值
//     * @return
//     * @throws Exception
//     * Cipher.ENCRYPT_MODE 加密数据
//     * DECRYPT_MODE 解密数据
//     */
//    public static String encrypt(String content,String encryptKey) throws Exception {
//        // 创建密码 getInstance()接受需要生成密钥的String变量，并返回生成密钥的KeyGenerator对象。
//        Cipher cipher = Cipher.getInstance(ALGORITHMS,PROVIDER);
//        // 加密器初始化(加密数据，密钥对象)  SecretKeySpec(字节组，算法)作用从给定的字节数组构造一个密钥。
//        cipher.init(Cipher.ENCRYPT_MODE,new SecretKeySpec(encryptKey.getBytes(),KEY_ALGORITHM));
//        // 采用base64算法进行转码,避免出现中文乱码  cipher.doFinal(需要加密的字符串转成字节)转换数据
//        return Base64.encodeBase64String(cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)));
//    }
//
//    /**
//     * 解密
//     * @param encryptKey  解密的字符串
//     * @param decryptKey  解密的key值
//     * @return
//     * @throws Exception
//     */
//    public static String decryt(String encryptKey,String decryptKey) throws Exception {
//        // 将字符串的key转成字节格式
//        byte[] decodeBase64 = Base64.decodeBase64(encryptKey);
//        // 设置加密器
//        Cipher cipher = Cipher.getInstance(ALGORITHMS,PROVIDER);
//        // 加密器初始化
//        cipher.init(Cipher.DECRYPT_MODE,new SecretKeySpec(decryptKey.getBytes(),KEY_ALGORITHM));
//        return new String(cipher.doFinal(decodeBase64)); // 构造成string字符串对象
//    }
//}
